/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Mercado.model;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author rafael
 */
public class Cadastro {
    List<Cliente> clientes;
    
    public Cadastro(){
        clientes = new ArrayList<>();
        carregaCadastro();
    }
    
    public void addCliente(Cliente cli){
        clientes.add(cli);
    }
    
    public int totalClientes(){
        return clientes.size();
    }
    
    public List<Cliente> getClientes(){
        return clientes;
    }
    
    public Cliente getCliente(int cod){
        return clientes.get(cod);
    }
    
    public void setCliente(int cod, Cliente cli){
        clientes.set(cod, cli);
    }
    
    public void geraRelatorioClientes(){
        try{
            BufferedWriter file = new BufferedWriter(new FileWriter("relatorios/relatorio_clientes.xls"));
            file.write("Nome\tEndereço\tTelefone\n");
            file.write("----\t--------\t--------\n");
            for (Cliente cli: clientes)
                file.write(cli.getNome()+"\t"+cli.getEndereco()+"\t"+cli.getTelefone()+"\n");
            file.close();
            System.out.println("Relatório de Clientes gerado com sucesso!");
        }catch(IOException ex){
            System.err.println("Erro ao gerar relatório de clientes!");
        }
            
    }
    
    public void geraRelatorioVendaCliente(){
        try {
            BufferedWriter file = new BufferedWriter(new FileWriter("relatorios/relatorio_venda_cliente.txt"));
            int len, i, j;
            for (Cliente cli: clientes){
                file.write("\n\nCliente: "+cli.getNome()+"\t Endereço: "+cli.getEndereco()+"\tTelefone: "+cli.getTelefone());
                for(i=0;i<cli.getQtdCompras();i++){
                    file.write("\nCompra "+i);
                    for (j=0;j<cli.getCompra(i).getTotalItens();j++){
                        file.write("\n\t"+j+"\t"+cli.getCompra(i).getItem(j).getCodigo()+"\t"+cli.getCompra(i).getItem(j).getNome()+
                                "\t"+cli.getCompra(i).getItem(j).getPreco()+"\tx"+cli.getCompra(i).getQtd(j)+"\tR$ "+
                                cli.getCompra(i).getValor(j));
                    }
                    file.write("\nTotal de Itens: "+cli.getCompra(i).getTotalItens()+"\t Total Valor: R$ "+cli.getCompra(i).getTotalPreco());
                }
            }
            file.close();
            System.out.println("Relatório de vendas por cliente gerado com sucesso!");
        } catch (IOException ex) {
            System.err.println("Arquivo durante a escrita do relatório de vendas por cliente!");
        }
    }
    
    public void geraRelatorioItem(){
        List<Produto> lp = new ArrayList<>();
        List<Float> qtd = new ArrayList<>();
        int i,j;
        for (Cliente cli : clientes){
            for (Compra com: cli.getCompras()){
                for (Produto p: com.getItens()){
                    i = lp.indexOf(p);
                    j = com.getItens().indexOf(p);
                    if (i!=-1)
                        qtd.set(i, com.getQtd(j)+qtd.get(i));
                    else{
                        lp.add(p);
                        qtd.add(com.getQtd(j));
                    }
                }
            }
        }
        try {
            BufferedWriter file = new BufferedWriter(new FileWriter("relatorios/relatorio_venda_item.xls"));
            file.write("Codigo\tProduto\tPreco\tQtd. Vendida\n"
                    +  "------\t-------\t-----\t------------\n");
            for (i=0;i<lp.size();i++)
                file.write(lp.get(i).getCodigo()+"\t"+lp.get(i).getNome()+"\t"+lp.get(i).getPreco()+
                        "\t"+qtd.get(i)+"\n");
            file.close();
            System.out.println("Relatório de vendas por item gerado com sucesso!");
        } catch (IOException ex) {
            System.err.println("Arquivo durante a escrita do relatório de vendas por item!");
        }
    }
    
    public void geraRelatorioItemPrefCli(){
        String max, temp;
        float fmax = 0,ftemp;
        int i,j;
        Estoque_abstract est;
        try{
            BufferedWriter file = new BufferedWriter(new FileWriter("relatorios/relatorio_item_pref_cliente.xls"));
            file.write("Cliente\tProduto\n------\t-------\n");
            for (Cliente cli: clientes){
                if (cli.getQtdCompras()>0){
                    est = new Estoque_abstract();
                    for (Compra com: cli.getCompras()){
                        i=0;
                        for (Produto p: com.getItens()){
                            est.adicionaProduto(p, com.getQtd(i));
                            i++;
                        }
                    }
                    fmax=0; i=0; j=0;
                    for(Float f: est.getQtdItens()){
                        if(f>=fmax){
                            fmax = f;
                            j = i;
                        }
                        i++;
                    }
                    file.write(cli.getNome()+"\t"+est.getProdutos().get(j).getNome()+"\n");
                }
            }
            file.close();

        }catch(IOException ex){}
    }

    private void carregaCadastro() {
        String read;
        String[] str;
        Produto p;
        Compra com = null;
        int i, num = -1;
        try {
            BufferedReader file = new BufferedReader(new FileReader("data/Cadastro.csv"));
            for(read = file.readLine(); read!=null; read = file.readLine()){
                str = read.split(",");
                /**
                 * str[0] Nome
                 * str[1] Endereço
                 * str[2] Telefone
                 */
                if(str.length==3){
                    for(i=0;i<3;i++)
                        if(str[i].charAt(0)==' ')
                            str[i] = str[i].substring(1, str[i].length()-1);
                    addCliente(new Cliente(str[0], str[1], str[2]));
                }
            }
            file.close();
            file = new BufferedReader(new FileReader("data/Vendas.csv"));
            str = file.readLine().split(",");
            do{
                num = Integer.parseInt(str[0]);
                com = new Compra();
                for(str = file.readLine().split(",");
                    str.length==4 || (str.length==1 && str[0].equals("-")); 
                    str = file.readLine().split(",")){
                    if(str[0].equals("-")){
                        clientes.get(num).addCompra(com);
                        com = new Compra();
                    }
                    else if(str.length==4){
                        /**
                         * str[0] Nome
                         * str[1] Preço
                         * str[2] Codigo
                         * str[3] Qtd
                         */
                        com.addItem(new Produto(str[0],Float.parseFloat(str[1]),Integer.parseInt(str[2])), Float.parseFloat(str[3]));
                    }
                }
                clientes.get(num).addCompra(com);
            }while(str!=null);
            System.out.println("Cadastro carregado com Sucesso!");
        } catch (FileNotFoundException ex) {
            System.err.println("Arquivo Cadastro.csv ou Vendas.csv não encontrado!");
        } catch (IOException ex2){
            System.err.println("Arquivo durante a leitura de Cadastro.txt!");
        } catch (NullPointerException ex3){
            if(num!=-1)
                clientes.get(num).addCompra(com);
        }   System.out.println("Cadastro carregado com Sucesso!");     
    }
    
    public void salvaCadastro(){
        try{
            BufferedWriter file = new BufferedWriter(new FileWriter("data/Cadastro.csv"));
            int i,j;
            for(Cliente c: getClientes()){
                file.write(c.getNome()+","+c.getEndereco()+","+c.getTelefone()+"\n");
            }
            file.close();
            file = new BufferedWriter(new FileWriter("data/Vendas.csv"));
            i=0;
            for(Cliente c: getClientes()){
                file.write(i+"\n");
                for (Compra com: c.getCompras()){
                    j=0;
                    for(Produto p: com.getItens()){
                        file.write(p.getNome()+","+p.getPreco()+","+p.getCodigo()+","+com.getQtd(j)+"\n");
                        j++;
                    }
                    if(!com.equals(c.getCompra(-1)))
                        file.write("-\n");
                }
                i++;
            }
            file.close();
            System.out.println("Cadastro salvo com sucesso!");
        }catch(IOException ex){
            System.err.println("Erro no Arquivo durante o salvamento do cadastro!");
        }
    }

}
